package socket;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

import service.Fichier_Avec_Chemin;


public class ThreadSocketSendFile extends Thread {
	// ATTRIBUTS
	private Socket socket;
	private BufferedReader streamBuffInput;
	private FileInputStream fileInput;
	private OutputStream streamOutput;
	private List<Fichier_Avec_Chemin> fichiersPartages;
	private String message;
	
	// CONSTRUCTEURS
	public ThreadSocketSendFile(Socket socket, List<Fichier_Avec_Chemin> fichiersPartages) {
		this.socket = socket;
		this.fichiersPartages = fichiersPartages;
		System.out.println("new ThreadSocketSendFile - Thread construit");
	}
	
	@Override
	public void run() {
		System.out.println("ThreadSocketSendFile.run");
		message = "";
		
		try {
			streamBuffInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// On attend le message indiquant le md5 correspondant au fichier voulu
			message = streamBuffInput.readLine();
			System.out.println("ThreadSocketSendFile.run - Hash MD5 requis : " + message);
			
			for (Fichier_Avec_Chemin tmpFichier : fichiersPartages) {
				
				// Envoie le fichier correspondant au MD5 demandé
				if (tmpFichier.getMd5().equals(message)) {
					envoyerFichier(new File(tmpFichier.getCheminFichier()));
					System.out.println("ThreadSocketSendFile.run - Fichier envoyé");
					break;
				}
			}
		}
		catch (Exception e) { System.err.println("ThreadSocketSendFile.run - Erreur : " + e.getMessage()); }
		finally {
			deconnexion();
		}
	}
	
	private void envoyerFichier(File fichier) {
		if (fichier != null && fichier.exists() && fichier.isFile()) {
			try {
				fileInput = new FileInputStream(fichier.getAbsolutePath());
				streamOutput = socket.getOutputStream();
				System.out.println("ThreadSocketSendFile.envoyerFichier - Flux récupérés.");
				
				byte buf[] = new byte[1024];
				int n;
				System.out.println("ThreadSocketSendFile.envoyerFichier - Ecriture du fichier dans la socket.");
				while((n = fileInput.read(buf)) != -1) {
					streamOutput.write(buf, 0, n);
				}
				System.out.println("ThreadSocketSendFile.envoyerFichier - Fin de l'écriture dans la socket.");
			}
			catch (Exception e) { System.err.println("ThreadSocketSendFile.envoyerFichier - Erreur : " + e.getMessage()); }
		}
	}
	
	private void deconnexion() {
		try {
			streamBuffInput.close();
			fileInput.close();
			streamOutput.close();
			socket.close();
			System.out.println("ThreadSocketSendFile.deconnexion - Déconnexion réussie.");
		}
		catch (Exception e) { System.err.println("ThreadSocketSendFile.deconnexion - Erreur deconnexion : " + e.getMessage()); }
	}
}
